package 算法;

public class binarySearchDemo {

    public static void main(String[] args) {
        /*
        优势：提高查找效率，
        二分查找/折半查找：数组中的数据必须是有序的。同时，每次查找都会排除一半的范围
        如果数据是乱的，先排序再用二分查找得到的索引没有实际意义，只能确定当前数字在数组中是否存在
        排序过后数字的位置可能发生变化，没有实际意义

        min和 max表示当前查找的范围
        mid=(min+max)/2   <--整数相除结果只能得到整数(向下取整 例如 3.5=3)
        如果查找的元素在mid左边 ，缩小范围时  min不变 max=mid-1
        如果查找的元素在mid右边 ，缩小范围时  max不变 min=mid+1
         */
        int[]arr={1,2,3,4,5,6,7,8,9,10};
        int number=7;
        System.out.println( binarySearch(arr,10));


    }
    public static int binarySearch(int[] arr,int number){
//        arr来记录查找的数组   number为需要查找的数字


//        1.定义两个变量来记录查找的范围
        int min=0;//索引位置
        int max=arr.length-1;//索引位置
        while(true){
            if (min>max){
                return -1;
            }

            //     1.找数据 mid 的位置
            int mid=(min+max)/2;
//            number和mid进项比较产生三种情况
            /*
            1. number在mid左边
            2. number在mid有边
            3. number等于mid
             */

            if (number<arr[mid]){
                max=mid-1;
            } else if (number>arr[mid]) {
                min=mid+1;

            }else{
                return mid;//返回的是索引的位置
            }
        }

    }



}